package com.example.demo;

import cn.smallbun.screw.core.Configuration;
import cn.smallbun.screw.core.engine.EngineConfig;
import cn.smallbun.screw.core.engine.EngineFileType;
import cn.smallbun.screw.core.engine.EngineTemplateType;
import cn.smallbun.screw.core.execute.DocumentationExecute;
import cn.smallbun.screw.core.process.ProcessConfig;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

public class DbWordComponent {

    public static void main(String[] args){

        System.out.println("==============生成文档开始================");
        createDbFile();
        System.out.println("==============生成文档结束================");
    }

    public static DataSource hikariDataSource() {

        Properties p = PropertiesUtils.getProperties();
        HikariConfig config = new HikariConfig();
        // 数据库连接
        config.setDriverClassName(p.getProperty("spring.datasource.driver-class-name"));
        config.setJdbcUrl(p.getProperty("spring.datasource.url"));
        config.setUsername(p.getProperty("spring.datasource.username"));
        config.setPassword(p.getProperty("spring.datasource.password"));
        // 数据库连接池设置
//        config.addDataSourceProperty("cachePrepStmts", "true");
//        config.addDataSourceProperty("prepStmtCacheSize", "250");
//        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
//        config.addDataSourceProperty("useServerPrepStmts", "true");
        return new HikariDataSource(config);
    }

    public static void createDbFile(){

        // 生成文件配置
        EngineConfig engineConfig = EngineConfig.builder()
                // 生成文件路径，自己mac本地的地址，这里需要自己更换下路径
                .fileOutputDir("e:/db-word")
                // 打开目录
                .openOutputDir(false)
                // 文件类型
                .fileType(EngineFileType.WORD)
                // 生成模板实现
                .produceType(EngineTemplateType.freemarker).build();

        // 生成文档配置（包含以下自定义版本号、描述等配置连接）
        Configuration config = Configuration.builder()
                .version("1.0")
                .description("工改数据库文档")
                .dataSource(hikariDataSource())
                .engineConfig(engineConfig)
                .produceConfig(getProcessConfig())
                .build();

        // 执行生成
        new DocumentationExecute(config).execute();
    }

    /**
     * 配置想要生成的表+ 配置想要忽略的表
     *
     * @return 生成表配置
     */
    public static ProcessConfig getProcessConfig() {

        // 忽略表名
//        List<String> ignoreTableName = Arrays.asList("a", "test_group");
//        // 忽略表前缀，如忽略a开头的数据库表
//        List<String> ignorePrefix = Arrays.asList("a", "t");
//        // 忽略表后缀
//        List<String> ignoreSuffix = Arrays.asList("_test", "czb_");

        return ProcessConfig.builder()
            //根据名称指定表生成
//            .designatedTableName(Arrays.asList("fire_user"))
            //根据表前缀生成
            .designatedTablePrefix(Arrays.asList("opu_"))
            //根据表后缀生成
            .designatedTableSuffix(new ArrayList<>())

//            //忽略表名
//            .ignoreTableName(ignoreTableName)
//            //忽略表前缀
//            .ignoreTablePrefix(ignorePrefix)
//            //忽略表后缀
//            .ignoreTableSuffix(ignoreSuffix)

            .build();
    }
}
